# 使用def关键字定义一个函数
def greet(name, message):
    """
    位置参数-函数定义
    :param name: 姓名
    :param message: 信息
    """
    print(f"Hello, {name}! {message}")


# 因为python没有严格的数据类型规范，所以在调用函数的时候，按照对应顺序从左到右一个一个传递参数就叫位置参数
greet("Alice", "How are you?")

# 调用同样的方法，我们通过关键字定位，指定message就是为：How are you? 这个时候就无关位置，message和name那个在前那个在后都无所谓
greet(message="How are you?", name="Alice")


def greet(name, message="How are you?"):
    """
    默认参数-函数定义
    :param name: 姓名
    :param message: 信息
    """
    print(f"Hello, {name}! {message}")


# 如果没有传递message参数，就使用默认参数值
greet("Alice")

# 如果传递了message参数，那么就使用我们传递的message参数
greet("Bob", "Nice to see you!")


# *args：用于传递不定数量的位置参数，将这些参数收集到一个元组中。
# **kwargs：用于传递不定数量的关键字参数，将这些参数收集到一个字典中。
def print_values(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")


print_values(1, 2, 3, name="Alice", age=30)


# 输出：
# 1
# 2
# 3
# name: Alice
# age: 30


def greet(name, *, message="How are you?"):
    print(f"Hello, {name}! {message}")


greet("Alice")  # 正常调用
greet("Bob", message="Nice to see you!")  # 通过关键字传递
# greet(name="Charlie", "How are you?")  # 这样调用会报错，因为 message 参数必须使用关键字传递


add = lambda x, y: x + y
print(add(5, 3))  # 输出 8
